﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks;

namespace WFExtended.Twitter
{
    /// <summary>
    /// Twitter Api Service Contract
    /// <remarks>
    /// See https://dev.twitter.com/docs/api/1.1 for more details
    /// </remarks>
    /// </summary>
    [ServiceContract(Name = "TwitterApi", Namespace = "https://api.twitter.com/1.1")]
    public interface ITwitterApi
    {
        #region Lists

        /// <summary>
        /// Returns all lists the user subscribes to, including their own
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Lists the user subscribes to</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/list.json?screen_name={username}")]
        List<List> GetUserLists(string username);

        /// <summary>
        /// Returns a timeline of tweets authored by members of the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="count">
        /// Specifies the number of results to retrieve per "page."
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Timeline of tweets</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/statuses.json?list_id={listID}&count={count}")]
        List<Status> GetTweetsFromList(long listID, int count = 100);

        /// <summary>
        /// Removes multiple members from a list
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="usernames">
        /// A comma separated list of screen names, up to 100 are allowed in a single request.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/members/destroy_all.json?list_id={listID}&screen_name={usernames}")]
        void RemoveMembersFromList(long listID, string usernames);

        /// <summary>
        /// Returns the lists the specified user has been added to. 
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="cursor">
        /// Breaks the results into pages.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Lists the specified user has been added to</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/memberships.json?screen_name={username}&cursor={cursor}")]
        Lists GetMembershipsLists(string username, long cursor = -1);

        /// <summary>
        /// Returns the subscribers of the specified list. 
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="cursor">
        /// Breaks the results into pages
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Subscribers of the specified list</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/subscribers.json?list_id={listID}&cursor={cursor}")]
        UserList GetSubscribersList(long listID, long cursor = -1);

        /// <summary>
        /// Subscribes the authenticated user to the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>List</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/subscribers/create.json?list_id={listID}")]
        List ListSubscribes(long listID);

        /// <summary>
        /// Unsubscribes the authenticated user from the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/subscribers/destroy.json?list_id={listID}")]
        void ListUnSubscribes(long listID);

        /// <summary>
        /// Adds multiple members to a list
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="usernames">
        /// A comma separated list of screen names, up to 100 are allowed in a single request.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/members/create_all.json?list_id={listID}&screen_name={usernames}")]
        void AddMembersToList(long listID, string usernames);

        /// <summary>
        /// Check if the specified user is a member of the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Specified User</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/members/show.json?list_id={listID}&screen_name={username}")]
        User GetMemberList(long listID, string username);

        /// <summary>
        /// Returns the members of the specified list. 
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="cursor">
        /// Breaks the results into pages.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Members of the specified list</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/members.json?list_id={listID}&cursor={cursor}")]
        UserList GetMembersList(long listID, long cursor = -1);

        /// <summary>
        /// Deletes the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>List deleted</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/destroy.json?list_id={listID}")]
        List DeleteList(long listID);

        /// <summary>
        /// Updates the specified list. 
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <param name="name">
        /// The name for the list.
        /// </param>
        /// <param name="mode">
        /// Whether your list is public or private. Values can be public or private.
        /// </param>
        /// <param name="description">
        /// The description to give the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/update.json?list_id={listID}&name={name}&mode={mode}&description={description}")]
        void UpdateList(long listID, string name = null, string mode = null, string description = null);

        /// <summary>
        /// Creates a new list for the authenticated user. 
        /// </summary>
        /// <param name="name">
        /// The name for the list.
        /// </param>
        /// <param name="mode">
        /// Whether your list is public or private. Values can be public or private.
        /// </param>
        /// <param name="description">
        /// The description to give the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>List created</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/create.json?name={name}&mode={mode}&description={description}")]
        List CreateList(string name, string mode = "public", string description = null);

        /// <summary>
        /// Returns the specified list.
        /// </summary>
        /// <param name="listID">
        /// The numerical id of the list.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Specified list</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/show.json?list_id={listID}")]
        List GetList(long listID);

        /// <summary>
        /// Obtain a collection of the lists the specified user is subscribed to
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="count">
        /// The amount of results to return per page.
        /// </param>
        /// <param name="cursor">
        /// Breaks the results into pages.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of the lists the specified user is subscribed to</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/subscriptions.json?screen_name={username}&count={count}&cursor={cursor}")]
        Lists GetListsSubscriptions(string username, int count = 20, long cursor = -1);

        /// <summary>
        /// Returns the lists owned by the specified Twitter user.
        /// <remarks>
        /// Private lists will only be shown if the authenticated user is also the owner of the lists.
        /// </remarks>
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="count">
        /// The amount of results to return per page.
        /// </param>
        /// <param name="cursor">
        /// Breaks the results into pages.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Lists owned by the specified user</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/lists/ownerships.json?screen_name={username}&count={count}&cursor={cursor}")]
        Lists GetListsOwned(string username, int count = 20, long cursor = -1); 

        #endregion

        #region Users

        /// <summary>
        /// Returns settings (including current trend, geo and sleep time information) for the authenticating user.
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>User Settings</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/account/settings.json")]
        UserSettings GetUserSettings();

        /// <summary>
        /// Returns a collection of user objects that the authenticating user is blocking.
        /// </summary>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <param name="cursor">
        /// Causes the list of IDs to be broken into pages of no more than 5000 IDs at a time. 
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of user objects</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/blocks/list.json?include_entities={includeEntities}&skip_status={skipStatus}&cursor={cursor}")]
        UserList GetUsersBlockList(bool includeEntities = true, bool skipStatus = false, long cursor = -1);

        /// <summary>
        /// Returns an array of numeric user ids the authenticating user is blocking.
        /// </summary>
        /// <param name="cursor">
        /// Causes the list of IDs to be broken into pages of no more than 5000 IDs at a time. 
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Array of numeric user ids the authenticating user is blocking</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/blocks/ids.json?cursor={cursor}")]
        IdsList GetUsersBlockIds(long cursor = -1);

        /// <summary>
        /// Blocks the specified user from following the authenticating user.
        /// </summary>
        /// <param name="username">
        /// The screen name of the potentially blocked user.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Blocked user</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/blocks/create.json?screen_name={username}&include_entities={includeEntities}&skip_status={skipStatus}")]
        User AddUserBlock(string username, bool includeEntities = true, bool skipStatus = false);

        /// <summary>
        /// Un-blocks the user specified in the usernam parameter for the authenticating user.
        /// </summary>
        /// <param name="username">
        /// The screen name of the potentially blocked user. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Un-blocked user </returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/blocks/destroy.json?screen_name={username}&include_entities={includeEntities}&skip_status={skipStatus}")]
        User RemoveUserBlock(string username, bool includeEntities = true, bool skipStatus = false);

        /// <summary>
        /// Returns fully-hydrated user objects for up to 100 users per request, as specified by comma-separated values 
        /// passed to the usernames parameters.
        /// </summary>
        /// <param name="usernames">
        /// A comma separated list of screen names, up to 100 are allowed in a single request. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users Collection</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/lookup.json?screen_name={usernames}&include_entities={includeEntities}")]
        List<User> UsersLookup(string usernames, bool includeEntities = true);

        /// <summary>
        /// Returns a variety of information about the user specified by username parameter. 
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Variety of information about the user</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/show.json?screen_name={username}&include_entities={includeEntities}")]
        User GetUser(string username, bool includeEntities = true);

        /// <summary>
        /// Provides a simple, relevance-based search interface to public user accounts on Twitter.
        /// </summary>
        /// <param name="query">
        /// The search query to run against people search.
        /// </param>
        /// <param name="page">
        /// Specifies the page of results to retrieve.
        /// </param>
        /// <param name="count">
        /// The number of potential user results to retrieve per page. This value has a maximum of 20.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users Collection</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/search.json?q={query}&page={page}&count={count}&include_entities={includeEntities}")]
        List<User> SearchUsers(string query, int page = 0, int count = 20, bool includeEntities = true);

        /// <summary>
        /// Returns a collection of users that the specified user can "contribute" to.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users that the specified user can "contribute" to</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/contributees.json?screen_name={username}&include_entities={includeEntities}&skip_status={skipStatus}")]
        List<User> GetContributees(string username, bool includeEntities = true, bool skipStatus = false);

        /// <summary>
        /// Returns a collection of users who can contribute to the specified account.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users who can contribute</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/contributors.json?screen_name={username}&include_entities={includeEntities}&skip_status={skipStatus}")]
        List<User> GetContributors(string username, bool includeEntities = true, bool skipStatus = false);


        /// <summary>
        /// Returns a map of the available size variations of the specified user's profile banner.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>User's profile banner</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/profile_banner.json?screen_name={username}")]
        UserPhoto GetUserBanner(string username);

        #endregion

        #region Friends & Followers

        /// <summary>
        /// Returns a collection of user_ids that the currently authenticated user does not want to receive retweets from.
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of numeric IDs</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/no_retweets/ids.json")]
        List<long> GetFriendshipsNoRetweetsIds();

        /// <summary>
        /// Returns a cursored collection of user IDs for every user the specified user is following (otherwise known as their "friends")
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="cursor">
        /// Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <param name="count">
        /// Specifies the number of IDs attempt retrieval of, up to a maximum of 5,000 per distinct request.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of numeric IDs</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friends/ids.json?screen_name={username}&cursor={cursor}&count={count}")]
        IdsList GetFriendsIds(string username, long cursor = -1, int count = 2500);

        /// <summary>
        /// Returns a cursored collection of user IDs for every user following the specified user.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="cursor">
        ///  Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <param name="count">
        /// Specifies the number of IDs attempt retrieval of, up to a maximum of 5,000 per distinct request.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of numeric IDs</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/followers/ids.json?screen_name={username}&cursor={cursor}&count={count}")]
        IdsList GetFollowersIds(string username, long cursor = -1, int count = 2500);

        /// <summary>
        /// Returns the relationships of the authenticating user to the comma-separated list of up to 100 screen_names or user_ids provided. 
        /// <remarks>
        /// Values for connections can be: following, following_requested, followed_by, none.
        /// </remarks>
        /// </summary>
        /// <param name="usernames">
        /// A comma separated list of screen names, up to 100 are allowed in a single request.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Relationships of the authenticating user</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/lookup.json?screen_name={usernames}")]
        List<FriendshipsLookup> FriendshipsLookup(string usernames);

        /// <summary>
        /// Returns a collection of numeric IDs for every user who has a pending request to follow the authenticating user.
        /// </summary>
        /// <param name="cursor">
        /// Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of numeric IDs</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/incoming.json?cursor={cursor}")]
        IdsList GetFriendshipsIncoming(long cursor = -1);

        /// <summary>
        /// Returns a collection of numeric IDs for every protected user for whom the authenticating user has a pending follow request.
        /// </summary>
        /// <param name="cursor">
        /// Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of numeric IDs</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/outgoing.json?cursor={cursor}")]
        IdsList GetFriendshipsOutgoing(long cursor = -1);

        /// <summary>
        /// Allows the authenticating users to follow the user specified in the ID parameter.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to befriend.
        /// </param>
        /// <param name="follow">
        /// Enable notifications for the target user.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Befriended user</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/create.json?screen_name={username}&follow={follow}")]
        User AddFriendships(string username, bool follow = true);

        /// <summary>
        /// Allows the authenticating user to unfollow the user specified in the ID parameter.
        /// </summary>
        /// <param name="username">
        /// The screen name of the user for whom to unfollow.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Unfollowed user</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/destroy.json?screen_name={username}")]
        User DeleteFriendships(string username);

        /// <summary>
        /// Allows one to enable or disable retweets and device notifications from the specified user.
        /// </summary>
        /// <param name="userID">
        /// The ID of the user for whom to befriend.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to befriend.
        /// </param>
        /// <param name="device">
        /// Enable/disable device notifications from the target user.
        /// </param>
        /// <param name="retweets">
        /// Enable/disable retweets from the target user.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Friendships</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/update.json?user_id={userID}&screen_name={username}&device={device}&retweets={retweets}")]
        RelationshipResult UpdateFriendships(string userID = null, string username = null, bool device = true, bool retweets = true);

        /// <summary>
        /// Returns detailed information about the relationship between two arbitrary users.
        /// </summary>
        /// <param name="sourceUsername">
        /// The screen_name of the subject user.
        /// </param>
        /// <param name="targetUsername">
        /// The screen_name of the target user.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Friendships</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friendships/show.json?source_screen_name={sourceUsername}&target_screen_name={targetUsername}")]
        RelationshipResult GetFriendships(string sourceUsername, string targetUsername);

        /// <summary>
        /// Returns a cursored collection of user objects for every user the specified user is following 
        /// </summary>
        /// <param name="userID">
        /// The ID of the user for whom to return results for.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="cursor">
        /// Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <param name="includeUserEntities">
        /// The user object entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users for every user the specified user is following</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/friends/list.json?user_id={userID}&screen_name={username}&cursor={cursor}&skip_status={skipStatus}&include_user_entities={includeUserEntities}")]
        UserList GetFriends(string userID = null, string username = null, long cursor = -1, bool skipStatus = false, bool includeUserEntities = true);

        /// <summary>
        /// Returns a cursored collection of user objects for users following the specified user.
        /// </summary>
        /// <param name="userID">
        /// The ID of the user for whom to return results for.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="cursor">
        /// Causes the results to be broken into pages of no more than 20 records at a time.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true statuses will not be included in the returned user objects.
        /// </param>
        /// <param name="includeUserEntities">
        /// The user object entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Users following the specified user</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/followers/list.json?user_id={userID}&screen_name={username}&cursor={cursor}&skip_status={skipStatus}&include_user_entities={includeUserEntities}")]
        UserList GetFollowers(string userID = null, string username = null, long cursor = -1, bool skipStatus = false, bool includeUserEntities = true);

        #endregion

        #region Timelines

        /// <summary>
        /// Returns the most recent tweets authored by the authenticating user that have been retweeted by others. 
        /// </summary>
        /// <param name="count">
        /// Specifies the number of tweets to try and retrieve, up to a maximum of 200.
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be disincluded when set to false.
        /// </param>
        /// <param name="includeUserEntities">
        /// The user entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Most recent tweets authored by the authenticating user that have been retweeted by others</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/retweets_of_me.json?count={count}&since_id={sinceID}&max_id={maxID}&trim_user={trimUser}&include_entities={includeEntities}&include_user_entities={includeUserEntities}")]
        List<Status> GetRetweetsOfMe(int count = 50, string sinceID = null, string maxID = null, bool trimUser = false, bool includeEntities = true, bool includeUserEntities = true);

        /// <summary>
        /// Returns a collection of the most recent Tweets and retweets posted by the authenticating user and the users they follow. 
        /// </summary>
        /// <param name="count">
        /// Specifies the number of tweets to try and retrieve, up to a maximum of 200.
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <param name="excludeReplies">
        /// This parameter will prevent replies from appearing in the returned timeline.
        /// </param>
        /// <param name="contributorDetails">
        /// This parameter enhances the contributors element of the status response to include the screen_name of the contributor. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Most recent Tweets and retweets posted by user</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/home_timeline.json?count={count}&since_id={sinceID}&max_id={maxID}&trim_user={trimUser}&exclude_replies={excludeReplies}&contributor_details={contributorDetails}&include_entities={includeEntities}")]
        List<Status> GetHomeTweets(int count = 50, string sinceID = null, string maxID = null, bool trimUser = false, bool excludeReplies = false, bool contributorDetails = true, bool includeEntities = true);

        /// <summary>
        /// Returns a collection of the most recent Tweets posted by the user indicated by the username or userID parameters.
        /// </summary>
        /// <param name="userID">
        /// The ID of the user for whom to return results for.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="count">
        /// Specifies the number of tweets to try and retrieve, up to a maximum of 200.
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <param name="excludeReplies">
        /// This parameter will prevent replies from appearing in the returned timeline.
        /// </param>
        /// <param name="contributorDetails">
        /// This parameter enhances the contributors element of the status response to include the screen_name of the contributor. 
        /// </param>
        /// <param name="includeRts">
        /// When set to false, the timeline will strip any native retweets
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Most recent Tweets</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/user_timeline.json?user_id={userID}&screen_name={username}&count={count}&since_id={sinceID}&max_id={maxID}&trim_user={trimUser}&exclude_replies={excludeReplies}&contributor_details={contributorDetails}&include_rts={includeRts}")]
        List<Status> GetRecentTweets(string userID = null, string username = null, int count = 50, string sinceID = null, string maxID = null, bool trimUser = false, bool excludeReplies = false, bool contributorDetails = true, bool includeRts = true);

        /// <summary>
        /// Returns the most recent mentions (tweets containing a users's @screen_name) for the authenticating user.
        /// </summary>
        /// <param name="count">
        /// Specifies the number of tweets to try and retrieve, up to a maximum of 200.
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <param name="contributorDetails">
        /// This parameter enhances the contributors element of the status response to include the screen_name of the contributor. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Most recent mentions</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/mentions_timeline.json?count={count}&since_id={sinceID}&max_id={maxID}&trim_user={trimUser}&contributor_details={contributorDetails}&include_entities={includeEntities}")]
        List<Status> GetRecentMentions(int count = 50, string sinceID = null, string maxID = null, bool trimUser = false, bool contributorDetails = true, bool includeEntities = true);

        #endregion

        #region Favorites

        /// Favorites the status specified in the ID parameter as the authenticating user. 
        /// Returns the favorite status when successful.
        /// </summary>
        /// <param name="statusID">
        /// The ID of the desired status.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Favorite Tweet</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/favorites/create.json?id={statusID}&include_entities={includeEntities}")]
        Status AddFavorite(string statusID, bool includeEntities = true);

        /// <summary>
        /// Un-favorites the status specified in the ID parameter as the authenticating user.
        /// Returns the un-favorited status in the requested format when successful.
        /// </summary>
        /// <param name="statusID">
        /// The ID of the desired status.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Un-favorited Tweet</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/favorites/destroy.json?id={statusID}&include_entities={includeEntities}")]
        Status DeleteFavorite(string statusID, bool includeEntities = true);

        /// <summary>
        /// Returns the 20 most recent Tweets favorited by the authenticating or specified user.
        /// </summary>
        /// <param name="userID">
        /// The ID of the user for whom to return results for.
        /// </param>
        /// <param name="username">
        /// The screen name of the user for whom to return results for.
        /// </param>
        /// <param name="count">
        /// Specifies the number of records to retrieve. Must be less than or equal to 200. 
        /// Defaults to 20.
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be omitted when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Favorites</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/favorites/list.json?user_id={userID}&screen_name={username}&count={count}&since_id={sinceID}&max_id={maxID}&include_entities={includeEntities}")]
        List<Status> GetFavorites(string userID = null, string username = null, int count = 20, string sinceID = null, string maxID = null, bool includeEntities = true);

        #endregion

        #region Tweets

        /// <summary>
        /// Returns information allowing the creation of an embedded representation of a Tweet on third party sites.
        /// </summary>
        /// <param name="id">
        /// The Tweet/status ID to return embed code for.
        /// </param>
        /// <param name="url">
        /// The URL of the Tweet/status to be embedded.
        /// </param>
        /// <param name="maxWidth">
        /// The maximum width in pixels that the embed should be rendered at.
        /// </param>
        /// <param name="hideMedia">
        /// Specifies whether the embedded Tweet should automatically expand images
        /// </param>
        /// <param name="hideThread">
        /// Specifies whether the embedded Tweet should automatically show the original message
        /// </param>
        /// <param name="omitScript">
        /// Specifies whether the embedded Tweet HTML should include a script element pointing to widgets.js
        /// </param>
        /// <param name="align">
        /// Specifies whether the embedded Tweet should be left aligned, right aligned, or centered in the page.
        /// </param>
        /// <param name="related">
        /// A value for the TWT related parameter.
        /// </param>
        /// <param name="lang">
        /// Language code for the rendered embed. This will affect the text and localization of the rendered HTML.
        /// <code>
        /// Example Values: en
        /// </code>
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Embedded representation of a Tweet</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/oembed.json?id={statusID}&url={url}&maxwidth={maxWidth}&hide_media={hideMedia}&hide_thread={hideThread}&omit_script={omitScript}&align={align}&related={related}&lang={lang}")]
        StatusoEmbed GetTweetoEmbed(string statusID, string url = null, int maxWidth = 250, bool hideMedia = false, bool hideThread = false, bool omitScript = false, string align = "center", string related = "twitter", string lang = null);

        /// <summary>
        /// Retweets a tweet. Returns the original tweet with retweet details embedded
        /// </summary>
        /// <param name="statusID">
        /// The ID of the desired status.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Original tweet</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/retweet/{statusID}.json?trim_user={trimUser}")]
        Status Retweet(string statusID, bool trimUser = false);

        /// <summary>
        /// Updates the authenticating user's current status and attaches media for upload.
        /// </summary>
        /// <param name="stream">
        /// The stream of the request
        /// Use TweetWithMediaRequest class to build your request stream
        /// <code>
        /// SendTweetWithMedia(new TweetWithMediaRequest()
        /// &nbps; {
        /// &nbps; &nbps; Text = "Media Test",
        /// &nbps; &nbps; Media = new Media()
        /// &nbps; &nbps; {
        /// &nbps; &nbps; &nbps; Filename = "mypicture",
        /// &nbps; &nbps; &nbps; Content = media
        /// &nbps; &nbps; },
        /// &nbps; }.StreamRequest)
        /// </code>
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Tweet Added</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            Method = "POST",
            UriTemplate = "/statuses/update_with_media.json")]
        Status SendTweetWithMedia(Stream stream);

        /// <summary>
        /// Updates the authenticating user's current status, also known as tweeting. 
        /// </summary>
        /// <param name="text">
        /// The text of your status update, typically up to 140 characters. 
        /// </param>
        /// <param name="inReplyToStatusID">
        /// The ID of an existing status that the update is in reply to.
        /// </param>
        /// <param name="latitude">
        /// The latitude of the location this tweet refers to.
        /// </param>
        /// <param name="longitude">
        /// The longitude of the location this tweet refers to.
        /// </param>
        /// <param name="placeID">
        /// A place in the world. These IDs can be retrieved from ReverseGeoCode.
        /// </param>
        /// <param name="displayCoordinates">
        /// Whether or not to put a pin on the exact coordinates a tweet has been sent from.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Tweet added</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/update.json?status={text}&in_reply_to_status_id={inReplyToStatusID}&lat={latitude}&long={longitude}&place_id={placeID}&display_coordinates={displayCoordinates}&trim_user={trimUser}")]
        Status SendTweet(string text, string inReplyToStatusID = null, string latitude = null, string longitude = null, string placeID = null, bool displayCoordinates = true, bool trimUser = false);

        /// <summary>
        /// Destroys the status specified by the required ID parameter. 
        /// </summary>
        /// <param name="statusID">
        /// The ID of the desired status.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Tweet deleted</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/destroy/{statusID}.json?trim_user={trimUser}")]
        Status DeleteTweet(string statusID, bool trimUser = false);

        /// <summary>
        /// Returns a single Tweet, specified by the id parameter. 
        /// The Tweet's author will also be embedded within the tweet
        /// </summary>
        /// <param name="statusID">
        /// The ID of the desired Tweet.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <param name="includeMyRetweet">
        /// When set to either true, any Tweets returned that have been retweeted by the authenticating user will include 
        /// an additional current_user_retweet node containing the ID of the source status for the retweet.
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Single Tweet</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/show.json?id={statusID}&trim_user={trimUser}&include_my_retweet={includeMyRetweet}&include_entities={includeEntities}")]
        Status GetTweet(string statusID, bool trimUser = false, bool includeMyRetweet = true, bool includeEntities = true);

        /// <summary>
        /// Returns up to 100 of the first retweets of a given tweet.
        /// </summary>
        /// <param name="statusID">
        /// The  ID of the desired status.
        /// </param>
        /// <param name="count">
        /// Specifies the number of records to retrieve. Must be less than or equal to 100.
        /// </param>
        /// <param name="trimUser">
        /// When set to either true, each tweet returned in a timeline will include a user object including only the status authors numerical ID.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>First retweets </returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/statuses/retweets/{statusID}.json?count={count}&trim_user={trimUser}")]
        List<Status> GetRetweets(string statusID, int count = 100, bool trimUser = false);

        #endregion

        #region Trends

        /// <summary>
        /// Returns the top 10 trending topics for a specific WOEID, if trending information is available for it.
        /// </summary>
        /// <param name="woeid">
        /// The Yahoo! Where On Earth ID of the location to return trending information for.
        /// Global information is available by using 1 as the WOEID.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Trends List</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/trends/place.json?id={woeid}")]
        List<TrendsResult> GetTrendsList(int woeid);

        /// <summary>
        /// Returns the locations that Twitter has trending topic information for, closest to a specified location
        /// </summary>
        /// <param name="latitude">
        /// If provided with a long parameter the available trend locations will be sorted by distance, 
        /// nearest to furthest, to the co-ordinate pair. 
        /// Example Values: 37.781157
        /// </param>
        /// <param name="longitude">
        /// If provided with a lat parameter the available trend locations will be sorted by distance, 
        /// nearest to furthest, to the co-ordinate pair.  
        /// Example Values: -122.400612831116
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Trend Locations</returns>
        [OperationContract(Name = "GetTrendLocationsWithOptions")]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/trends/closest.json?lat={latitude}&long={longitude}")]
        List<TrendLocation> GetTrendLocations(string latitude, string longitude);

        /// <summary>
        /// Returns the locations that Twitter has trending topic information for.
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Trend Locations</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/trends/available.json")]
        List<TrendLocation> GetTrendLocations();

        #endregion

        #region Saved Searches

        /// <summary>
        /// Destroys a saved search for the authenticating user.
        /// The authenticating user must be the owner of saved search id being destroyed.
        /// </summary>
        /// <param name="id">The ID of the saved search.</param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>The saved search deleted</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/saved_searches/destroy/{id}.json")]
        SavedSearch DeleteSavedSearch(string id);

        /// <summary>
        /// Create a new saved search for the authenticated user. A user may only have 25 saved searches.
        /// </summary>
        /// <param name="query">The query of the search the user would like to save.</param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>The saved search added</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/saved_searches/create.json?query={query}")]
        SavedSearch AddSavedSearch(string query);

        /// <summary>
        /// Retrieve the information for the saved search represented by the given id.
        /// The authenticating user must be the owner of saved search ID being requested.
        /// </summary>
        /// <param name="id">
        /// The ID of the saved search.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>The saved search</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/saved_searches/show/{id}.json")]
        SavedSearch GetSavedSearch(string id);

        /// <summary>
        /// Returns the authenticated user's saved search queries.
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>User's saved search queries</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/saved_searches/list.json")]
        List<SavedSearch> GetSavedSearchesList();
        
        #endregion
        
        #region Places & Geo

        /// <summary>
        /// Creates a new place object at the given latitude and longitude.
        /// </summary>
        /// <param name="name">
        /// The name a place is known as.
        /// </param>
        /// <param name="containedWithin">
        /// This is the place_id which you would like to restrict the search results to. 
        /// </param>
        /// <param name="token">
        /// The token found in the response from GetSimilarPlaces
        /// </param>
        /// <param name="latitude">
        /// The latitude to search around.
        /// </param>
        /// <param name="longitude">
        /// The longitude to search around.
        /// </param>
        /// <param name="streetAddress">
        /// The street address.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Place added</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/geo/create.json?name={name}&contained_within={containedWithin}&token={token}&lat={latitude}&long={longitude}&attribute:street_address={streetAddress}")]
        Place AddGeoPlace(string name, string containedWithin, string token, string latitude, string longitude, string streetAddress = null);

        /// <summary>
        /// Locates places near the given coordinates which are similar in name.
        /// </summary>
        /// <param name="latitude">
        /// The latitude to search around.
        /// </param>
        /// <param name="longitude">
        /// The longitude to search around.
        /// </param>
        /// <param name="name">
        /// The name a place is known as.
        /// </param>
        /// <param name="containedWithin">
        /// This is the place_id which you would like to restrict the search results to. 
        /// </param>
        /// <param name="streetAddress">
        /// This parameter searches for places which have this given street address.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Geo Places</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/geo/similar_places.json?lat={latitude}&long={longitude}&name={name}&contained_within={containedWithin}&attribute:street_address={streetAddress}")]
        GeoSearchResult GetSimilarPlaces(string latitude, string longitude, string name, string containedWithin = null, string streetAddress = null);

        /// <summary>
        /// Reverses the geo code.
        /// </summary>
        /// <param name="latitude">
        /// The latitude to search around.
        /// </param>
        /// <param name="longitude">
        /// The longitude to search around.
        /// </param>
        /// <param name="granularity">
        /// This is the minimal granularity of place types to return and must be one of: poi, neighborhood, city, admin or country.
        /// If no granularity is provided for the request neighborhood is assumed.
        /// </param>
        /// <param name="accuracy">
        /// A hint on the "region" in which to search.
        /// If a number, then this is a radius in meters, but it can also take a string that is suffixed with ft to specify feet. 
        /// </param>
        /// <param name="maxResults">
        /// A hint as to the number of results to return. 
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Geo Places</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/geo/reverse_geocode.json?lat={latitude}&long={longitude}&granularity={granularity}&accuracy={accuracy}&max_results={maxResults}")]
        GeoSearchResult ReverseGeoCode(string latitude, string longitude, string granularity = null, string accuracy = null, int maxResults = 20);

        /// <summary>
        /// Returns all the information about a known place.
        /// </summary>
        /// <param name="placeID">
        /// A place in the world. These IDs can be retrieved from ReverseGeoCode
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>The place</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/geo/id/{placeID}.json")]
        Place GetPlace(string placeID);

        /// <summary>
        /// Search for places that can be attached to a statuses/update. 
        /// </summary>
        /// <param name="latitude">
        /// The latitude to search around. 
        /// This parameter will be ignored if outside that range, if it is not a number
        /// </remarks>
        /// </param>
        /// <param name="longitude">
        /// The longitude to search around. 
        /// This parameter will be ignored if outside that range, if it is not a number
        /// </param>
        /// <param name="query">
        /// Free-form text to match against while executing a geo-based query, best suited for finding nearby locations by name. 
        /// </param>
        /// <param name="ip">
        /// An IP address. Used when attempting to fix geolocation based off of the user's IP address.
        /// </param>
        /// <param name="granularity">
        /// This is the minimal granularity of place types to return and must be one of: poi, neighborhood, city, admin or country.
        /// If no granularity is provided for the request neighborhood is assumed.
        /// </param>
        /// <param name="accuracy">
        /// A hint on the "region" in which to search.
        /// If a number, then this is a radius in meters, but it can also take a string that is suffixed with ft to specify feet. 
        /// <code>
        /// Example Values: 5ft
        /// </code>
        /// </param>
        /// <param name="containedWithin">
        /// This is the place_id which you would like to restrict the search results to. 
        /// </param>
        /// <param name="streetAddress">
        /// This parameter searches for places which have this given street address.
        /// </param>
        /// <param name="maxResults">
        /// A hint as to the number of results to return. 
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Geo Places</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/geo/search.json?lat={latitude}&long={longitude}&query={query}&ip={ip}&granularity={granularity}&accuracy={accuracy}&max_results={maxResults}&contained_within={containedWithin}&attribute:street_address={streetAddress}")]
        GeoSearchResult SearchGeo(string latitude = null, string longitude = null, string query = null, string ip = null, string granularity = null, string accuracy = null, string containedWithin = null, string streetAddress = null, int maxResults = 20);

        #endregion

        #region Suggested Users

        /// <summary>
        /// Access the users in a given category of the Twitter suggested user list and return their most recent status
        /// </summary>
        /// <param name="slug">
        /// The short name of list or a category
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Twitter suggested user list</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/suggestions/{slug}/members.json")]
        List<UserWithStatus> GetSuggestedUserListWithStatus(string slug);

        /// <summary>
        /// Access the users in a given category of the Twitter suggested user list.
        /// </summary>
        /// <param name="slug">
        /// The short name of list or a category
        /// </param>
        /// <param name="lang">
        /// Restricts tweets to the given language, given by an ISO 639-1 code. Language detection is best-effort.
        /// <code>
        /// Example Values: en
        /// </code>
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Twitter suggested user list</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/suggestions/{slug}.json?lang={lang}")]
        SuggestedUserList GetSuggestedUserList(string slug, string lang = null);

        /// <summary>
        /// Returns the list of suggested user categories
        /// </summary>
        /// <param name="lang">
        /// Restricts tweets to the given language, given by an ISO 639-1 code. Language detection is best-effort.
        /// <code>
        /// Example Values: en
        /// </code>
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Suggested user categories</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/users/suggestions.json?lang={lang}")]
        List<SuggestedUserCategory> GetSuggestedUserCategories(string lang = null);

        #endregion

        #region Direct Messages

        /// <summary>
        /// Sends a new direct message to the specified user from the authenticating user. 
        /// <param name="userID">
        /// The ID of the user who should receive the direct message. 
        /// </param>
        /// <param name="text">
        /// The text of your direct message. Be sure to URL encode as necessary, and keep the message under 140 characters.
        /// </param>
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct message</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/new.json?user_id={userID}&text={text}")]
        DirectMessage SendDirectMessage(long userID, string text);

        /// <summary>
        /// Sends a new direct message to the specified user from the authenticating user. 
        /// <param name="username">
        /// The screen name of the user who should receive the direct message. 
        /// </param>
        /// <param name="text">
        /// The text of your direct message. Be sure to URL encode as necessary, and keep the message under 140 characters.
        /// </param>
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct message</returns>
        [OperationContract(Name = "AddDirectMessageWithUsername")]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/new.json?screen_name={username}&text={text}")]
        DirectMessage SendDirectMessage(string username, string text);

        /// <summary>
        /// Destroys the direct message specified in the required ID parameter.
        /// <param name="id">
        /// The ID of the direct message to delete.
        /// </param>
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct message</returns>
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/destroy.json?id={id}")]
        DirectMessage DeleteDirectMessage(long id);

        /// <summary>
        /// Returns a single direct message, specified by an id parameter. 
        /// <param name="id">
        /// The ID of the direct message.
        /// </param>
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct message</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/show.json?id={id}")]
        DirectMessage ShowDirectMessage(long id);

        /// <summary>
        /// Returns the 20 most recent direct messages sent by the authenticating user. 
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct messages</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/sent.json")]
        List<DirectMessage> GetDirectMessagesSent();

        /// <summary>
        /// Returns the most recent direct messages sent by the authenticating user. 
        /// </summary>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="count">
        /// Specifies the number of direct messages to try and retrieve, up to a maximum of 200. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will not be included when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct messages</returns>
        [OperationContract(Name = "GetDirectMessagesSentWithOptions")]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages/sent.json?since_id={sinceID}&max_id={maxID}&count={count}&include_entities={includeEntities}")]
        List<DirectMessage> GetDirectMessagesSent(string sinceID = null, string maxID = null, int count = 20, bool includeEntities = true);

        /// <summary>
        /// Returns the 20 most recent direct messages sent to the authenticating user. 
        /// Includes detailed information about the sender and recipient user. 
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct messages</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages.json")]
        List<DirectMessage> GetDirectMessages();

        /// <summary>
        /// Returns the most recent direct messages sent to the authenticating user. 
        /// Includes detailed information about the sender and recipient user. 
        /// </summary>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID. 
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID.
        /// </param>
        /// <param name="count">
        /// Specifies the number of direct messages to try and retrieve, up to a maximum of 200. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will not be included when set to false.
        /// </param>
        /// <param name="skipStatus">
        /// When set to either true, t or 1 statuses will not be included in the returned user objects.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Direct messages</returns>
        [OperationContract(Name = "GetDirectMessagesWithOptions")]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/direct_messages.json?since_id={sinceID}&max_id={maxID}&count={count}&include_entities={includeEntities}&skip_status={skipStatus}")]
        List<DirectMessage> GetDirectMessages(string sinceID = null, string maxID = null, int count = 20, bool includeEntities = true, bool skipStatus = false);

        #endregion

        #region Search

        /// <summary>
        /// Returns a collection of relevant Tweets matching a specified query.
        /// </summary>
        /// <param name="searchQuery">
        /// A UTF-8, URL-encoded search query of 1,000 characters maximum, including operators. 
        /// Queries may additionally be limited by complexity.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of relevant Tweets</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "/search/tweets.json?q={searchQuery}")]
        SearchTweetsResult SearchTweets(string searchQuery);

        /// <summary>
        /// Returns a collection of relevant Tweets matching a specified query.
        /// </summary>
        /// <param name="searchQuery">
        /// A UTF-8, URL-encoded search query of 1,000 characters maximum, including operators. 
        /// Queries may additionally be limited by complexity.
        /// </param>
        /// <param name="lang">
        /// Restricts tweets to the given language, given by an ISO 639-1 code. Language detection is best-effort.
        /// <code>
        /// Example Values: en
        /// </code>
        /// </param>
        /// <param name="resultType">
        /// Specifies what type of search results you would prefer to receive. The current default is "mixed." Valid values include: 
        /// * mixed: Include both popular and real time results in the response, 
        /// * recent: return only the most recent results in the response, 
        /// * popular: return only the most popular results in the response.
        /// </param>
        /// <param name="geocode">
        /// Returns tweets by users located within a given radius of the given latitude/longitude. 
        /// The parameter value is specified by "latitude,longitude,radius", where radius units must be specified as either "mi" (miles) or "km" (kilometers).
        /// <code>
        /// Example Values: 37.781157,-122.398720,1mi
        /// </code>
        /// </param>
        /// <param name="until">
        /// Returns tweets generated before the given date. Date should be formatted as YYYY-MM-DD
        /// <code>
        /// Example Values: 2012-09-01
        /// </code>
        /// </param>
        /// <param name="sinceID">
        /// Returns results with an ID greater than (that is, more recent than) the specified ID
        /// </param>
        /// <param name="maxID">
        /// Returns results with an ID less than (that is, older than) or equal to the specified ID
        /// </param>
        /// <param name="count">
        /// The number of tweets to return per page, up to a maximum of 100. Defaults to 15. 
        /// </param>
        /// <param name="includeEntities">
        /// The entities node will be disincluded when set to false.
        /// </param>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Collection of relevant Tweets</returns>
        [OperationContract(Name="SearchTweetsWithOptions")]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "/search/tweets.json?q={searchQuery}&lang={lang}&result_type={resultType}&geocode={geocode}&until={until}&since_id={sinceID}&max_id={maxID}&count={count}&include_entities={includeEntities}")]
        SearchTweetsResult SearchTweets(string searchQuery, string lang = null, string resultType = null, string geocode = null, string until = null, string sinceID = null, string maxID = null, int count = 15, bool includeEntities = true);

        #endregion

        #region Help

        /// <summary>
        /// Gets the Twitter's Privacy Policy
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Twitter's Privacy Policy</returns>
        [OperationContract]
        [WebGet(BodyStyle= WebMessageBodyStyle.Bare, 
            RequestFormat= WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/help/privacy.json")]
        Privacy GetPrivacy();

        /// <summary>
        /// Get the Twitter Terms of Service
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Twitter Terms of Service</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/help/tos.json")]
        TermsOfService GetTermsOfService();

        /// <summary>
        /// Gets the list of languages supported by Twitter
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns></returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/help/languages.json")]
        List<Language> GetLanguages();

        /// <summary>
        /// Gets the current rate limits for methods belonging to the specified resource families
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns>Rate limits</returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/application/rate_limit_status.json")]
        RateLimitStatus GetRateLimitStatus();

        /// <summary>
        /// Gets  the current configuration used by Twitter including twitter.com slugs which are not usernames, 
        /// maximum photo resolutions, and t.co URL lengths.
        /// </summary>
        /// <exception cref="ForbiddenException">
        /// An unauthorized access
        /// </exception>
        /// <exception cref="RateLimitException">
        /// Too may request Exception. 
        /// See https://dev.twitter.com/docs/rate-limiting/1.1/limits for more details
        /// </exception>
        /// <exception cref="NotFoundException">
        /// Resource Not Found
        /// </exception>
        /// <returns></returns>
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/help/configuration.json")]
        Configuration GetConfiguration();

        #endregion

    }
}
